package q1.project.core.entity;

import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.Id;
import jakarta.persistence.MappedSuperclass;
import jakarta.persistence.Version;
import java.io.Serializable;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.TenantId;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import q1.project.core.jpa.annotation.Comment;
import q1.project.core.jpa.annotation.JpaUuidId;

/**
 * JPA 基础实体类（增强版） 使用 Hibernate @Filter 实现自动租户隔离
 *
 * <p>包含通用字段：ID、租户ID、创建人、创建时间、更新人、更新时间、删除标记等
 *
 * <p><strong>租户隔离机制：</strong>
 *
 * <ul>
 *   <li>使用 @FilterDef 定义租户过滤器
 *   <li>使用 @Filter 自动应用过滤条件
 *   <li>所有查询自动添加 tenant_id 条件，无需手动处理
 * </ul>
 *
 * @author Q1 Team
 * @version 2.0
 */
@Getter
@Setter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity implements Serializable {

  @TenantId
  @Comment("租户ID")
  @Column( nullable = false, length = 32)
  private String tenantId;

  @Id
  @Comment("主键ID")
  @JpaUuidId
  @Column(length = 32)
  private String id;

  @Version
  @Column(columnDefinition = "BIGINT DEFAULT 0")
  @Comment("乐观锁版本")
  private Long version;

}
